\documentclass[t,10pt,aspectratio=169]{beamer} % 16:9 宽屏比例，适合现代投影
\usepackage{ctex} % 中文支持
\usepackage{amsmath, amssymb} % 数学公式与符号
\usepackage{graphicx}
\usepackage{pythonhighlight}
\usepackage{url}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% 使表格美观
\usepackage{array}
\newcolumntype{M}[1]{>{\centering\arraybackslash}m{#1}}
%\newcolumntype{N}{@{}m{0pt}@{}}
\setlength\extrarowheight{3pt}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% 主题设置（推荐简洁风格）
\usetheme{Madrid}
\usecolortheme{default} % 可选：seahorse, beaver, dolphin 等

\title{美食推荐系统 }
\author{五六七}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}

\begin{frame}
  \titlepage
\end{frame}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}{内容提要 }


\begin{enumerate}
\item  根据顾客的消费记录，给顾客推荐一道美食。

\end{enumerate}

\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}{目录}


\begin{enumerate}
\item  问题描述
\item  建立模型
\item  编程计算
\item  回答问题
\item  习题

\end{enumerate}

\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}{1.1. 问题描述 }

\begin{itemize}\itemsep0.5em 

\item  
有一个风味美食平台，经营着多种不同风味的地方特色美食。在系统中维护着一个原始的打分表。
其中行表示各个顾客，列表示各种菜品。

\item  每个顾客对消费某道菜品之后，都会打分，分数范围为1-5分，分数越高表示评价越高。
顾客还没消费的菜品，打分初始值为零分。

\item  现在一共有11道菜品，一共有18位顾客的打分表。
问题是对这些顾客，对其尚未品尝的美食，进行打分估计。从而可以推荐打分估计最高的美食。


\end{itemize}

\end{frame}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}{1.2. 顾客消费打分表（部分） }

{\footnotesize 
\begin{table}[ht]\centering 
%\caption{顾客消费打分表}\vspace{0.3cm}
\begin{tabular}{|M{1.2cm}|M{0.6cm}|M{0.6cm}|M{0.6cm}|M{0.6cm}|M{0.6cm}|M{0.6cm}|M{0.6cm}|M{0.6cm}|M{0.6cm}|M{0.6cm}|M{0.6cm}|}\hline 
%&A1&A2&A3&A4&A5&A6&A7&A8&A9&A10&A11  \\ \hline 
菜品&叉烧肠粉&新疆手抓饭&四川火锅&粤式烧鹅饭&大盘鸡拌面&东北饺子&重庆辣子鸡&广东虾饺&剁椒鱼头&兰州拉面&烤羊排 \\ \hline 
编号&	1&	2&	3&	4&	5&	6&	7&	8&	9&	10&	11 \\ \hline 
丁一&	5&	2&	1&	4&	0&	0&	2&	4&	0&	0&	0 \\ \hline 
刘二&	0&	0&	0&	0&	0&	0&	0&	0&	0&	3&	0 \\ \hline 
张三&	1&	0&	5&	2&	0&	0&	3&	0&	3&	0&	1 \\ \hline 
$\vdots$&	$\vdots$&	$\vdots$&	$\vdots$&	$\vdots$&	$\vdots$&	$\vdots$&	$\vdots$&	$\vdots$&	$\vdots$&	$\vdots$&	$\vdots$ \\ \hline 
%李四&	0&	5&	0&	0&	4&	0&	1&	0&	0&	0&	0 \\ \hline 
%王五&	0&	0&	0&	0&	0&	4&	0&	0&	0&	4&	0 \\ \hline 
%马六&	0&	0&	1&	0&	0&	0&	1&	0&	0&	5&	0 \\ \hline 
%陈七&	5&	0&	2&	4&	2&	1&	0&	3&	0&	1&	0 \\ \hline 
%胡八&	0&	4&	0&	0&	5&	4&	0&	0&	0&	0&	5 \\ \hline 
%赵九&	0&	0&	0&	0&	0&	0&	4&	0&	4&	5&	0 \\ \hline 
%钱十&	0&	0&	0&	4&	0&	0&	1&	5&	0&	0&	0 \\ \hline 
%孙甲&	0&	0&	0&	0&	4&	5&	0&	0&	0&	0&	3 \\ \hline 
%周乙&	4&	2&	1&	4&	0&	0&	2&	4&	0&	0&	0 \\ \hline 
%吴丙&	0&	1&	4&	1&	2&	1&	5&	0&	5&	0&	0 \\ \hline 
%郑丁&	0&	0&	0&	0&	0&	4&	0&	0&	0&	4&	0 \\ \hline 
%冯戊&	2&	5&	0&	0&	4&	0&	0&	0&	0&	0&	0 \\ \hline 
%储己&	5&	0&	0&	0&	0&	0&	0&	4&	2&	0&	0 \\ \hline 
魏庚&	0&	2&	4&	0&	4&	3&	4&	0&	0&	0&	0 \\ \hline 
高辛&	0&	3&	5&	1&	0&	0&	4&	1&	0&	0&	0 \\ \hline 
\end{tabular}
\end{table}
}


\end{frame}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}{2.1. 建立模型的思路 }

\begin{itemize}\itemsep0.5em 

\item  
一种思路是根据顾客已有的打分，计算菜品之间的相似程度。

\item  
然后任选一位顾客，使用菜品相似程度作为权重，来估计这位顾客对未消费菜品的可能打分。

%考虑顾客喜好的相似程度。

\end{itemize}

\end{frame}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}{2.2. 把数据保存为一个矩阵 }

\begin{itemize}\itemsep0.5em 

\item  
将打分表保存为一个矩阵。这是一个 $18\times 11$ 的矩阵。
\begin{eqnarray}
A=(a_{ij})_{18\times 11}=\begin{pmatrix} 
5&2&1&4&\cdots &0&0 \\ 
0&0&0&0&\cdots &3&0 \\ 
1&0&5&2&\cdots &0&1 \\ 
0&5&0&0&\cdots &0&0 \\ 
\vdots & \vdots & \vdots & \vdots & &\vdots & \vdots \\ 
0&2&4&0&\cdots &0&0 \\ 
0&3&5&1&\cdots &0&0 \\ 
\end{pmatrix}. 
\end{eqnarray}


\end{itemize}

\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}{2.3. 皮尔逊相关系数 }

\begin{itemize}\itemsep0.5em 

\item  
然后计算列向量之间的相关系数。按定义，两个列向量
\begin{eqnarray}
\begin{pmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \\ \end{pmatrix}, 
\begin{pmatrix} y_1 \\ y_2 \\ \vdots \\ y_n \\ \end{pmatrix}
\end{eqnarray}
之间的皮尔逊相关系数为
\begin{eqnarray}
r = \frac{ \sum\limits_{k=1}^{n} (x_k-\bar{x})(y_k-\bar{y})}
{ \sqrt{\sum\limits_{k=1}^{n} (x_k-\bar{x})^2} \sqrt{\sum\limits_{k=1}^{n} (y_k-\bar{y})^2} }. 
\end{eqnarray}

\end{itemize}

\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}{2.4. 皮尔逊相关系数 }

\begin{itemize}\itemsep0.5em 

\item  其中 $\bar{x}$ 与 $\bar{y}$ 是这两个向量的所有分量的平均值，即
\begin{eqnarray}
\bar{x} = \frac{1}{n}\sum\limits_{k=1}^{n} x_k, \,\,\, 
\bar{y} = \frac{1}{n}\sum\limits_{k=1}^{n} y_k. 
\end{eqnarray}


\end{itemize}

\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}{2.5. 从相关系数到相似程度 }

\begin{itemize}\itemsep0.5em 

\item  
设这个矩阵的11个列向量的两两之间的相关系数为 
\begin{eqnarray}
r_{ij}, \,\,\, i,j=1,2,\cdots, 11. 
\end{eqnarray}

\item  
两个列向量的皮尔逊相关系数的取值范围是 $-1\le r\le 1$. 但是我们希望菜品之间的相似程度的衡量取值范围为 $0\le s\le 1$. 于是作一个线性函数，将相关系数 $r$ 变换为相似程度 $s$, 公式取为 
\begin{eqnarray}
s_{ij} = \frac{1+r_{ij}}{2}, \,\,\, i,j=1,2,\cdots, 11. 
\end{eqnarray}


\end{itemize}

\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}{2.6. 举例说明 }

\begin{itemize}\itemsep0.5em 

\item  
以第一位顾客丁一为例。这位顾客已经评价过的菜品编号为1,2,3,4,7,8, 打分分别为 5,2,1,4,2,4. 
现在我们想估计这位顾客对菜品5的打分。

\item  
我们考虑菜品5与菜品1、菜品5与菜品2、菜品5与菜品3、菜品5与菜品4、菜品5与菜品7、菜品5与菜品8的相关系数，用这些相关系数作为权重，将这位顾客对菜品1、菜品2、菜品3、菜品4、菜品7、菜品8的已有的打分，计算加权平均。

\item  
计算的公式为
\begin{eqnarray}
b_{1,5} = \frac{a_{1,1}s_{1,5} + a_{1,2}s_{2,5} + a_{1,3}s_{3,5} + a_{1,4}s_{4,5} + a_{1,7}s_{7,5} + a_{1,8}s_{8,5} }
{s_{1,5} + s_{2,5} +s_{3,5} +s_{4,5} +s_{7,5} +s_{8,5}}. 
\end{eqnarray}
其中 $a_{i,j}$ 是顾客 $i$ 对菜品 $j$ 的打分，$s_{i,j}$ 是菜品 $i$ 与菜品 $j$ 的相似程度。

\end{itemize}

\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}{3.1. 编程计算 }

\begin{itemize}\itemsep0.5em 

\item  
以第18位顾客高辛为例。这位顾客已经评价过的菜品编号为 2,3,4,7,8, 打分分别为 3,5,1,4,1. 
估计这位顾客对菜品1的打分为
\begin{eqnarray}
b_{18,1} = \frac{a_{18,2}s_{2,1} + a_{18,3}s_{3,1} + a_{18,4}s_{4,1} + a_{18,7}s_{7,1} + a_{18,8}s_{8,1} }
{s_{2,1} + s_{3,1} +s_{4,1} +s_{7,1} +s_{8,1} }. 
\end{eqnarray}


\end{itemize}

\end{frame}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}[fragile]{3.2. Python程序 （计算菜品之间的相似程度）}

\begin{python}
#程序文件ex3_3.py
import numpy as np
#import pandas as pd

a = np.loadtxt('data3_6_1.txt')  #载入评分数据
b = 0.5 * np.corrcoef(a.T) + 0.5  #计算菜品之间的相似程度
#c= pd.DataFrame(b)  #将相似程度保存为一个数据框
#c.to_excel('data3_6_2.xlsx', index=False)  #保存为Excel表格
\end{python}

\end{frame}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}[fragile]{3.3. Python程序（计算与高辛有关的菜品编号与评分） }

\begin{python}
user = 18  #考虑第18号顾客高辛
n = a.shape[1]  #菜品的个数，返回 11

no = np.where(a[user-1, :]==0)[0] #高辛没评分的菜品编号
	#返回 [ 0  4  5  8  9 10]

yb = set(range(n)) - set(no)  #高辛已评分的菜品编号
	#返回 {1, 2, 3, 6, 7}

yb = list(yb)  #将集合转化为列表
	#返回 [1, 2, 3, 6, 7]

ys = a[user-1, yb]  #高辛已评分的菜品的分数
	#返回 [3. 5. 1. 4. 1.]

sc = np.zeros(len(no))  #高辛没评分的菜品的估计评分的初始化
\end{python}

\end{frame}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}[fragile]{3.4. Python程序（用加权平均作为估计评分） }

\begin{python}
for i in range(len(no)):
    sim = b[no[i], yb]  #第i个没评分的菜品与已评分的菜品的相似程度
    sc[i] = ys @ sim / sum(sim)  #用加权平均作为第i个没评分的菜品的估计评分

print('未评分项的编号为：', no+1)
	#返回 [ 1  5  6  9 10 11]

print('未评分项的分数为：', np.round(sc, 2))
	#返回 [2.35 3.03 2.97 3.15 2.9  2.85]

\end{python}

\end{frame}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}{4.1. 回答问题 }

\begin{itemize}\itemsep0.5em 

\item  %给高辛的推荐菜品依次为：
高辛对未曾品尝的其余菜品的打分的估计如表所示。

\begin{center}
\begin{table}[ht]\centering 
\caption{对高辛打分的预测}\vspace{0.3cm}
\begin{tabular}{|c|c|c|c|c|c|c|}\hline 
菜品编号 &1 &5 &6 &9 &10 &11  \\ \hline 
估计评分 &2.35 &3.03 &2.97 &3.15 &2.90 &2.85  \\ \hline 
\end{tabular}
\end{table}
\end{center}


\end{itemize}

\end{frame}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}[fragile]{5.1. 习题 }

\begin{enumerate}\itemsep0.5em 

\item  手工计算下述两个数据向量的相关系数，并写程序计算验证。
\begin{python}
x=[3, 0, 2, 3, 0, 3, 2, 2, 4, 0]
y=[1, 0, 0, 0, 4, 3, 0, 3, 1, 0]
\end{python}


\end{enumerate}

\end{frame}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}{参考文献  }

\begin{thebibliography}{1}

\bibitem{sishoukui-2} 司守奎,孙玺菁. {Python数学建模算法与应用}, 国防工业出版社. 2022年1月第1版. 


\end{thebibliography}


\end{frame}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\end{document}


